package com.yzw.reconnheart;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: YangZhenWei
 * @PROJECT_NAME: nettyTeach
 * @DESCRIPTION:
 * @USER: root
 * @DATE: 2023/2/8 22:35
 **/
public class HandlerServerReconnHeart extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf in=(ByteBuf) msg;
        System.out.println("接收到客户端的消息"+in.toString(CharsetUtil.UTF_8));
        //写入并发送消息给客户端
        // 检测到读超时时，就向服务器发送一个消息包
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:MM:ss:SSS");
        String strDate = dateFormat.format(new Date());
        ctx.writeAndFlush(Unpooled.copiedBuffer("这是服务端在Read方法中反馈的消息" + strDate + "\r\n", CharsetUtil.UTF_8));
    }

    /**
     * 当链接到通道时进行的处理
     *
     * @param ctx 通道
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 建立链接后channelActive方法只会被调用一次，这里的逻辑，建立链接后，字节序列被发送到服务器，编码格式是utf-8
        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:MM:ss:SSS");
        String strDate = dateFormat.format(new Date());
        ctx.writeAndFlush(Unpooled.copiedBuffer("这是客户端通过Active 发送的消息" + strDate + "\r\n", CharsetUtil.UTF_8));
    }

    /**
     * 当通道处于非活动状态时触发的动作，该方法会在通道失效时调用一次
     *
     * @param ctx 通道
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        Channel incoming = ctx.channel();
        System.out.println("服务器掉线了");
    }

    /**
     *  处理 io事件的异常
     *
     * @param ctx
     * @param cause
     * @throws Exception 抛出异常
     *
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}
